import mysql.connector
from mysql.connector import Error

class Especialidade:
    def __init__(self, descricao, id_especialidade=None):
        self.id_especialidade = id_especialidade
        self.descricao = descricao

    def __str__(self):
        return "[%s] %s" % (self.id_especialidade, self.descricao)

class BancoDados:
    def __init__(self, host="localhost", user="administrador",
                 password="admin", database="ProjetoPosto"):
        self.host = host
        self.user = user
        self.password = password
        self.database = database
        self.conexao = None

    def conectar(self):
        try:
            self.conexao = mysql.connector.connect(
                host=self.host,
                user=self.user,
                password=self.password,
                database=self.database
            )
            print("Conexão com o banco de dados bem sucedida!")
        except Error as erro:
            print(f"Ocorreu um erro ao se conectar ao banco de dados: {erro}")
            self.conexao = None

    def desconectar(self):
        if self.conexao:
            self.conexao.close()
            print("A conexão com o MySQL foi fechada!")

    def inserir(self, especialidade):
        cursor = self.conexao.cursor()
        sql = "INSERT INTO Especialidade (descricao) VALUES (%s)"
        cursor.execute(sql, (especialidade.descricao,))
        self.conexao.commit()
        print("%s registro inserido." % cursor.rowcount)
        cursor.close()

    def listar(self):
        cursor = self.conexao.cursor()
        cursor.execute("SELECT id_especialidade, descricao FROM Especialidade")
        resultado = cursor.fetchall()
        cursor.close()

        especialidades = []
        for id_especialidade, descricao in resultado:
            especialidades.append(Especialidade(descricao, id_especialidade))
        return especialidades

    def buscar_por_id(self, id_especialidade):
        cursor = self.conexao.cursor()
        cursor.execute(
            "SELECT id_especialidade, descricao FROM Especialidade WHERE id_especialidade = %s",
            (id_especialidade,)
        )
        registro = cursor.fetchone()
        cursor.close()

        if registro:
            return Especialidade(registro[1], registro[0])
        return None

    def atualizar(self, especialidade):
        cursor = self.conexao.cursor()
        sql = "UPDATE Especialidade SET descricao = %s WHERE id_especialidade = %s"
        cursor.execute(sql, (especialidade.descricao, especialidade.id_especialidade))
        self.conexao.commit()
        print("%s registro atualizado." % cursor.rowcount)
        cursor.close()

    def remover(self, id_especialidade):
        cursor = self.conexao.cursor()
        cursor.execute(
            "DELETE FROM Especialidade WHERE id_especialidade = %s",
            (id_especialidade,)
        )
        self.conexao.commit()
        print("%s registro removido." % cursor.rowcount)
        cursor.close()

def menu_adicionar(bd):
    descricao = input("Descrição da especialidade: ")
    nova = Especialidade(descricao)
    bd.inserir(nova)

def menu_listar(bd):
    for especialidade in bd.listar():
        print(especialidade)

def menu_buscar(bd):
    id_especialidade = input("ID da especialidade: ")
    especialidade = bd.buscar_por_id(id_especialidade)
    if especialidade:
        print(especialidade)
    else:
        print("Especialidade não encontrada.")
    return especialidade

def menu_atualizar(bd):
    especialidade = menu_buscar(bd)
    if especialidade:
        nova_descricao = input("Nova descrição [%s]: " % especialidade.descricao)
        especialidade.descricao = nova_descricao
        bd.atualizar(especialidade)

def menu_remover(bd):
    id_especialidade = input("ID da especialidade a remover: ")
    bd.remover(id_especialidade)

def menu_principal():
    bd = BancoDados()
    bd.conectar()

    if not bd.conexao:
        return

    while True:
        print("\nMENU DE CADASTRO DE ESPECIALIDADES")
        print("1 - Adicionar especialidade")
        print("2 - Listar todas as especialidades")
        print("3 - Buscar por uma especialidade")
        print("4 - Atualizar especialidade existente")
        print("5 - Remover especialidade")
        print("0 - Sair do programa")
        opcao = input("Digite uma opção: ")

        if opcao == "1":
            menu_adicionar(bd)
        elif opcao == "2":
            menu_listar(bd)
        elif opcao == "3":
            menu_buscar(bd)
        elif opcao == "4":
            menu_atualizar(bd)
        elif opcao == "5":
            menu_remover(bd)
        elif opcao == "0":
            break
        else:
            print("Opção inválida.")

    bd.desconectar()

if __name__ == "__main__":
    menu_principal()